package com.yhgarden.bbs.mapper.system;

import com.yhgarden.bbs.entity.system.EntityProperty;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;

/**
 * 数据库操作
 * Created by caimb on 2017/4/24.
 */
public interface DatabaseMapper {

    /**
     * 创建数据库用户
     *
     * @param userName 数据库用户名
     * @param host 主机
     * @param password 密码
     * @return
     */
    public int createUser(@Param("userName") String userName,
                          @Param("host") String host,
                          @Param("password") String password);

    /**
     * 删除表字段
     * @param tableName
     * @param entityProperties
     */
    public void alterTableDeleteColumn(@Param("tableName") String tableName,
                                       @Param("fields") List<EntityProperty> entityProperties);

    /**
     * 更新数据库用户
     *
     * @param userName 数据库用户名
     * @param host 主机
     * @param password 密码
     * @return
     */
    public int updateUser(@Param("userName") String userName,
                          @Param("host") String host,
                          @Param("password") String password);

    /**
     * 获取数据库详情
     *
     * @param databaseName 数据库名
     * @return 返回MySQL数据库information_schema.SCHEMATA中的数据库记录
     */
    public Map getDatabase(@Param("databaseName") String databaseName);

    /**
     * 创建数据库
     *
     * @param databaseName 数据库名
     * @return
     */
    public int createDatabase(@Param("databaseName") String databaseName);

    /**
     * 给数据库用户授权
     *
     * @param privileges 权限
     * @param databaseName 数据库名
     * @param userName 用户名
     * @param host 主机
     * @return
     */
    public int grantPrivileges(@Param("privileges") String privileges,
                               @Param("databaseName") String databaseName,
                               @Param("userName") String userName,
                               @Param("host") String host);

    /**
     * 在数据库中创建表
     * @param tableName 表名
     * @param comment 注释
     */
    public int createTable(@Param("tableName") String tableName,
                           @Param("comment") String comment);

    /**
     * 删除表
     * @param tableName
     */
    void dropTable(@Param("tableName") String tableName);

    void alterTableRename(@Param("oldTableName") String oldTableName,
                          @Param("newTableName") String newTableName);

    void alterTableComment(@Param("tableName") String tableName,
                           @Param("comment") String comment);

    /**
     * 检查数据库表字段
     * @param schema 数据库名
     * @param tableName 表名
     * @param columnName 字段名
     * @return
     */
    public int checkTableColumn(@Param("schema") String schema,
                                @Param("tableName") String tableName,
                                @Param("columnName") String columnName);

    /**
     * 添加改表字段
     * @param tableName 表名
     * @param entityProperty 字段对象，
     * @param columnType 字段数据类型，如int，varchar(128)
     * @param after 此列放在在哪个字段之后
     */
    public void alterTableAddColumn(@Param("tableName") String tableName,
                                    @Param("field") EntityProperty entityProperty,
                                    @Param("columnType") String columnType,
                                    @Param("after") String after,
                                    @Param("comment") String comment);

    /**
     * 修改表字段数据类型
     * @param tableName 表名
     * @param entityProperty 字段对象，
     * @param columnType 字段数据类型，如int，varchar(128)
     * @param after 此列放在在哪个字段之后
     */
    public void alterTableModifyColumn(@Param("tableName") String tableName,
                                       @Param("field") EntityProperty entityProperty,
                                       @Param("columnType") String columnType,
                                       @Param("after") String after,
                                       @Param("comment") String comment);
    /**
     * 修改表字段数据类型
     * @param tableName 表名
     * @param fieldName 字段
     */
    public void alterTableDropColumn(@Param("tableName") String tableName,
                                     @Param("fieldName") String fieldName);

    /**
     * 修改表字段名及数据类型
     * @param tableName 表名
     * @param oldFieldName 旧字段名
     * @param entityProperty 字段对象，
     * @param columnType 字段数据类型，如int，varchar(128)
     * @param after 此列放在在哪个字段之后
     */
    public void alterTableChangeColumn(@Param("tableName") String tableName,
                                       @Param("oldFieldName") String oldFieldName,
                                       @Param("field") EntityProperty entityProperty,
                                       @Param("columnType") String columnType,
                                       @Param("after") String after,
                                       @Param("comment") String comment);

}
